package spese.gestore.androidiani;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Questa classe definisce il database riguardante l'elenco delle Spese interno all'applicazione
 * @author Fusinato Lorenzo - Androidiani
 *
 */

public class SpeseDb {  

    SQLiteDatabase mDb;
    DbHelper mDbHelper;
    Context mContext;
    private static final String DB_NAME="DbSpese";//nome del db
    private static final int DB_VERSION=1; //numero di versione del nostro db
   
    
    /**
     * Quando istanziamo questa classe, istanziamo anche l'helper
     * @param ctx
     */
    public SpeseDb(Context ctx){
            mContext=ctx;
            mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);
    }
   
    /**
     * Il database su cui agiamo è leggibile/scrivibile
     */
    public void open(){  //il database su cui agiamo è leggibile/scrivibile
            mDb=mDbHelper.getWritableDatabase();
           
    }
    
    /**
     * Questo metodo cancella un'intera spesa tramite il passaggio del ID dello scontrino
     * @param id
     */
    public boolean delete_row(String id){   //cancellazione parziale
    	
    	return mDb.delete(SpeseMetaData.SPESE_TABLE, SpeseMetaData.ID + "=" + id, null)>0;
    	                                                                            
    	}
    
    /**
     * Questo metodo cancella tutte le spese legate ad una certa missione
     * @param id
     */
    public boolean delete_rows_by_miss(String id){
    	
    	return mDb.delete(SpeseMetaData.SPESE_TABLE, SpeseMetaData.SPESE_MISSIONE_KEY + "=" + id, null)>0;
    	                                                                            
    	}
    
    /**
     * Chiudiamo il database su cui agiamo
     */
    public void close(){
            mDb.close();
    }
   
    /**
     * Metodo per inserire i dati nel db delle Spese
     * @param luogo
     * @param data
     * @param categoria
     * @param description
     * @param valuta
     * @param persone
     * @param costo
     * @param foto
     * @param missione
     */
    public void insertSpesa(String luogo,String data,String categoria, String description, String valuta, int persone, float costo, String foto, String missione){ //metodo per inserire i dati
            ContentValues cv=new ContentValues();
            cv.put(SpeseMetaData.SPESE_LUOGO_KEY, luogo);
            cv.put(SpeseMetaData.SPESE_DATE_KEY, data);
            cv.put(SpeseMetaData.SPESE_CATEGORIA_KEY, categoria);
            cv.put(SpeseMetaData.SPESE_DESCRIPTION_KEY, description);
            cv.put(SpeseMetaData.SPESE_VALUTA_KEY, valuta);
            cv.put(SpeseMetaData.SPESE_PERSONE_KEY, persone);
            cv.put(SpeseMetaData.SPESE_COSTO_KEY, costo);
            cv.put(SpeseMetaData.SPESE_FOTO_KEY, foto);
            cv.put(SpeseMetaData.SPESE_MISSIONE_KEY, missione);
            mDb.insert(SpeseMetaData.SPESE_TABLE, null, cv);
    }
   
    /**
     * Metodo che ritorna uno string contenente il record alla riga "row" e colonna "pos"
     * @param row
     * @param pos
     * @return
     */
    public String getRecord(String row, int pos){
    	String name = null;
    	Cursor c = mDb.query(SpeseMetaData.SPESE_TABLE, null, SpeseMetaData.ID + "=" + row, null, null, null, null);
    	c.moveToFirst();
    	name = String.valueOf(c.getString(pos));
    	return name;
    }
    
    public boolean update(String rowId, String luogo, 
		    String data, String categoria, String description, String valuta, int persone, float costo, String foto, String missione) {
		
		ContentValues args = new ContentValues();
        args.put(SpeseMetaData.SPESE_LUOGO_KEY, luogo);
        args.put(SpeseMetaData.SPESE_DATE_KEY, data);
        args.put(SpeseMetaData.SPESE_CATEGORIA_KEY, categoria);
        args.put(SpeseMetaData.SPESE_DESCRIPTION_KEY, description);
        args.put(SpeseMetaData.SPESE_VALUTA_KEY, valuta);
        args.put(SpeseMetaData.SPESE_PERSONE_KEY, persone);
        args.put(SpeseMetaData.SPESE_COSTO_KEY, costo);
        args.put(SpeseMetaData.SPESE_FOTO_KEY, foto);
        args.put(SpeseMetaData.SPESE_MISSIONE_KEY, missione);
        return mDb.update(SpeseMetaData.SPESE_TABLE, args, 
                         SpeseMetaData.ID + "=" + rowId, null) > 0;
		
	}
    
    /**
     * Metodo per fare la query di tutti i dati
     * @return
     */
    public Cursor fetchSPESE(){
            return mDb.query(SpeseMetaData.SPESE_TABLE, null,null,null,null,null,null);              
    }

    /**
     * Metodo per fare la query delle spese tramite l'input della Missione
     * @param missione
     * @return
     */
    public Cursor SPESEbyMissione(String missione){ 
    	    String[] miss_query={missione};
            return mDb.query(SpeseMetaData.SPESE_TABLE,null,SpeseMetaData.SPESE_MISSIONE_KEY+"=?",miss_query,null,null,null);              
    }
    
    /**
     * I metadati della tabella, accessibili ovunque
     * @author Fusinato Lorenzo - Androidiani
     *
     */
    static class SpeseMetaData {
            static final String SPESE_TABLE = "Spese";
            static final String ID = "_id";
            static final String SPESE_LUOGO_KEY = "luogo";
            static final String SPESE_DATE_KEY = "data";
            static final String SPESE_CATEGORIA_KEY = "categoria";
            static final String SPESE_DESCRIPTION_KEY = "descrizione";
            static final String SPESE_VALUTA_KEY = "valuta";
            static final String SPESE_PERSONE_KEY = "persone";
            static final String SPESE_COSTO_KEY = "costo";
            static final String SPESE_FOTO_KEY = "foto";
            static final String SPESE_MISSIONE_KEY = "missione";
    }

    /**
     * Codice sql di creazione della tabella
     */
    private static final String SPESE_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "
                    + SpeseMetaData.SPESE_TABLE + " ("
                    + SpeseMetaData.ID + " integer primary key autoincrement, "
                    + SpeseMetaData.SPESE_LUOGO_KEY + " text, "
                    + SpeseMetaData.SPESE_DATE_KEY + " text, "
                    + SpeseMetaData.SPESE_CATEGORIA_KEY + " text, "
                    + SpeseMetaData.SPESE_DESCRIPTION_KEY + " text, "
                    + SpeseMetaData.SPESE_VALUTA_KEY + " text, "
                    + SpeseMetaData.SPESE_PERSONE_KEY + " integer, "
                    + SpeseMetaData.SPESE_COSTO_KEY + " float, "
                    + SpeseMetaData.SPESE_FOTO_KEY + " text, "
                    + SpeseMetaData.SPESE_MISSIONE_KEY + " text);";

    /**
     * Classe che ci aiuta nella creazione del db
     * @author Fusinato Lorenzo - Androidiani
     *
     */
    private class DbHelper extends SQLiteOpenHelper { 

            public DbHelper(Context context, String name, CursorFactory factory,int version) {
                    super(context, name, factory, version);
            }

            @Override
            public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
                    _db.execSQL(SPESE_TABLE_CREATE);
            }

            @Override
            public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                    //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione

            }

    }
           

}